const { sequelize, testConnection, syncDatabase } = require('../dao/dbConnect');
const { 
  User, 
  Course, 
  CourseCategory, 
  EvaluationRecord, 
  GameRecord, 
  DailyRecord 
} = require('../dao/model');

/**
 * 数据库初始化脚本
 * 创建数据库表结构并插入初始数据
 */

// 初始分类数据
const initialCategories = [
  {
    name: '基础发音',
    description: '学习普通话基础发音技巧',
    parent_id: null,
    sort_order: 1
  },
  {
    name: '声母练习',
    description: '声母发音专项练习',
    parent_id: 1,
    sort_order: 1
  },
  {
    name: '韵母练习',
    description: '韵母发音专项练习',
    parent_id: 1,
    sort_order: 2
  },
  {
    name: '声调练习',
    description: '四声调发音练习',
    parent_id: 1,
    sort_order: 3
  },
  {
    name: '词汇朗读',
    description: '常用词汇朗读练习',
    parent_id: null,
    sort_order: 2
  },
  {
    name: '日常用语',
    description: '日常生活用语练习',
    parent_id: 5,
    sort_order: 1
  },
  {
    name: '商务用语',
    description: '商务场景用语练习',
    parent_id: 5,
    sort_order: 2
  },
  {
    name: '文章朗读',
    description: '文章段落朗读练习',
    parent_id: null,
    sort_order: 3
  },
  {
    name: '诗词朗诵',
    description: '古诗词朗诵练习',
    parent_id: 8,
    sort_order: 1
  },
  {
    name: '散文朗读',
    description: '散文作品朗读练习',
    parent_id: 8,
    sort_order: 2
  }
];

// 初始课程数据
const initialCourses = [
  {
    title: '普通话基础入门',
    description: '从零开始学习普通话，掌握基本发音规则',
    category_id: 1,
    difficulty: 'beginner',
    is_free: true,
    price: 0,
    cover_image: 'https://example.com/images/course1.jpg',
    content: '本课程将带您从最基础的声母、韵母开始学习普通话...',
    duration: 1800, // 30分钟
    views: 1250,
    likes: 89,
    enrollments: 456
  },
  {
    title: '声母发音技巧',
    description: '详细讲解21个声母的正确发音方法',
    category_id: 2,
    difficulty: 'beginner',
    is_free: true,
    price: 0,
    cover_image: 'https://example.com/images/course2.jpg',
    content: '声母是普通话发音的基础，本课程将逐一讲解...',
    duration: 2400, // 40分钟
    views: 980,
    likes: 67,
    enrollments: 234
  },
  {
    title: '韵母发音精讲',
    description: '掌握39个韵母的发音要领和练习方法',
    category_id: 3,
    difficulty: 'intermediate',
    is_free: false,
    price: 29.9,
    cover_image: 'https://example.com/images/course3.jpg',
    content: '韵母发音是普通话学习的重点和难点...',
    duration: 3600, // 60分钟
    views: 756,
    likes: 45,
    enrollments: 123
  },
  {
    title: '四声调练习',
    description: '学会正确掌握普通话的四个声调',
    category_id: 4,
    difficulty: 'intermediate',
    is_free: false,
    price: 19.9,
    cover_image: 'https://example.com/images/course4.jpg',
    content: '声调是普通话的重要组成部分，直接影响语义...',
    duration: 2700, // 45分钟
    views: 634,
    likes: 38,
    enrollments: 89
  },
  {
    title: '日常用语实战',
    description: '学习日常生活中常用的普通话表达',
    category_id: 6,
    difficulty: 'beginner',
    is_free: true,
    price: 0,
    cover_image: 'https://example.com/images/course5.jpg',
    content: '通过实际场景学习日常用语的正确表达...',
    duration: 2100, // 35分钟
    views: 1456,
    likes: 112,
    enrollments: 567
  }
];

// 初始管理员用户
const initialAdmin = {
  username: 'admin',
  password: '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
  nickname: '系统管理员',
  email: 'admin@example.com',
  phone: '13800138000',
  role: 'admin',
  status: 'active',
  avatar: 'https://example.com/images/admin-avatar.jpg',
  level: 10,
  experience: 10000,
  total_study_time: 0,
  points: 0
};

/**
 * 创建数据库表
 */
async function createTables() {
  console.log('开始创建数据库表...');
  
  try {
    // 强制重新创建表（开发环境）
    const force = process.env.NODE_ENV === 'development';
    await syncDatabase(force);
    console.log('✅ 数据库表创建成功');
  } catch (error) {
    console.error('❌ 数据库表创建失败:', error);
    throw error;
  }
}

/**
 * 插入初始分类数据
 */
async function seedCategories() {
  console.log('开始插入分类数据...');
  
  try {
    // 检查是否已有数据
    const existingCount = await CourseCategory.count();
    if (existingCount > 0) {
      console.log('⚠️  分类数据已存在，跳过插入');
      return;
    }

    // 插入分类数据
    await CourseCategory.bulkCreate(initialCategories);
    console.log('✅ 分类数据插入成功');
  } catch (error) {
    console.error('❌ 分类数据插入失败:', error);
    throw error;
  }
}

/**
 * 插入初始课程数据
 */
async function seedCourses() {
  console.log('开始插入课程数据...');
  
  try {
    // 检查是否已有数据
    const existingCount = await Course.count();
    if (existingCount > 0) {
      console.log('⚠️  课程数据已存在，跳过插入');
      return;
    }

    // 插入课程数据
    await Course.bulkCreate(initialCourses);
    console.log('✅ 课程数据插入成功');
  } catch (error) {
    console.error('❌ 课程数据插入失败:', error);
    throw error;
  }
}

/**
 * 创建管理员用户
 */
async function createAdminUser() {
  console.log('开始创建管理员用户...');
  
  try {
    // 检查管理员是否已存在
    const existingAdmin = await User.findOne({ where: { username: 'admin' } });
    if (existingAdmin) {
      console.log('⚠️  管理员用户已存在，跳过创建');
      return;
    }

    // 创建管理员用户
    await User.create(initialAdmin);
    console.log('✅ 管理员用户创建成功');
    console.log('📝 管理员登录信息:');
    console.log('   用户名: admin');
    console.log('   密码: password');
  } catch (error) {
    console.error('❌ 管理员用户创建失败:', error);
    throw error;
  }
}

/**
 * 主初始化函数
 */
async function initializeDatabase() {
  console.log('🚀 开始初始化数据库...');
  console.log('='.repeat(50));
  
  try {
    // 测试数据库连接
    await testConnection();
    
    // 创建表结构
    await createTables();
    
    // 插入初始数据
    await seedCategories();
    await seedCourses();
    await createAdminUser();
    
    console.log('='.repeat(50));
    console.log('🎉 数据库初始化完成！');
    console.log('📊 数据统计:');
    console.log(`   分类数量: ${await CourseCategory.count()}`);
    console.log(`   课程数量: ${await Course.count()}`);
    console.log(`   用户数量: ${await User.count()}`);
    
  } catch (error) {
    console.error('💥 数据库初始化失败:', error);
    process.exit(1);
  } finally {
    // 关闭数据库连接
    await sequelize.close();
    console.log('🔌 数据库连接已关闭');
  }
}

// 如果直接运行此脚本
if (require.main === module) {
  initializeDatabase();
}

module.exports = {
  initializeDatabase,
  createTables,
  seedCategories,
  seedCourses,
  createAdminUser
};
